{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# This information helps with debugging and getting support :)\n", "import sys, platform\n", "import pandas as pd\n", "import bifacial_radiance as br\n", "print(\"Working on a \", platform.system(), platform.release())\n", "print(\"Python version \", sys.version)\n", "print(\"Pandas version \", pd.__version__)\n", "print(\"bifacial_radiance version \", br.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 11 - AgriPV Systems\n", "\n", "This journal shows how to model an AgriPV site, calculating the irradiance not only on the modules but also the irradiance received by the ground to evaluate available solar ersource for plants. \n", "\n", "We assume that bifacia_radiacne is already installed in your computer. This works for bifacial_radiance v.3 release.\n", "\n", "These journal outlines 4 useful uses of bifacial_radiance and some tricks: \n", "\n", "* Creating the modules in the AgriPV site\n", "* Adding extra geometry for the pillars/posts supporting the AgriPV site\n", "* Hacking the sensors to sample the ground irradiance and create irradiance map\n", "* Adding object to simulate variations in ground albedo from different crops between rows.\n", "\n", "\n", "#### Steps:\n", "\n", "1. Generate the geometry \n", "2. Analyse the Ground Irradiance \n", "3. Analyse and MAP the Ground Irradiance \n", "4. Adding different Albedo Section \n", " \n", "#### Preview of what we will create: \n", " \n", "![Another view](../images_wiki/AdvancedJournals/AgriPV_2.PNG)\n", "![AgriPV Image We will create](../images_wiki/AdvancedJournals/AgriPV_1.PNG)\n", "And this is how it will look like:\n", "\n", "![AgriPV modeled step 4](../images_wiki/AdvancedJournals/AgriPV_step4.PNG)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Generate the geometry \n", "\n", "This section goes from setting up variables to making the OCT axis. We are also adding some custom elements for the torquetubes and posts.\n", "\n", "We've done this before a couple times, no new stuff here. \n", "\n", "The magic is that, for doing the carport we see in the figure, we are going to do a 4-up configuration of modules (**numpanels**), and we are going to repeat that 3-UP 6 times (**nMods**)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Your simulation will be stored in C:\\Users\\cdeline\\Documents\\Python Scripts\\Bifacial_Radiance\\bifacial_radiance\\TEMP\\Tutorial_11\n" ] } ], "source": [ "import os\n", "from pathlib import Path\n", "\n", "testfolder = str(Path().resolve().parent.parent / 'bifacial_radiance' / 'TEMP' / 'Tutorial_11')\n", "\n", "if not os.path.exists(testfolder):\n", " os.makedirs(testfolder)\n", " \n", "print (\"Your simulation will be stored in %s\" % testfolder)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import bifacial_radiance as br\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "from matplotlib import pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "path = C:\\Users\\cdeline\\Documents\\Python Scripts\\Bifacial_Radiance\\bifacial_radiance\\TEMP\\Tutorial_11\n", "Loading albedo, 1 value(s), 0.200 avg\n", "1 nonzero albedo values.\n", "Getting weather file: USA_NJ_McGuire.AFB.724096_TMY3.epw\n", " ... OK!\n", "8760 line in WeatherFile. Assuming this is a standard hourly WeatherFile for the year for purposes of saving Gencumulativesky temporary weather files in EPW folder.\n", "Coercing year to 2001\n", "Saving file EPWs\\metdata_temp.csv, # points: 8760\n", "Calculating Sun position for Metdata that is right-labeled with a delta of -30 mins. i.e. 12 is 11:30 sunpos\n", "\n", "Module Name: test-module\n", "Module was shifted by 0.078 in X to avoid sensors on air\n", "This is a Cell-Level detailed module with Packaging Factor of 0.81 \n", "Module test-module updated in module.json\n", "Pre-existing .rad file objects\\test-module.rad will be overwritten\n", "\n", "Created tutorial_11.oct\n" ] } ], "source": [ "simulationname = 'tutorial_11'\n", "\n", "#Location:\n", "lat = 40.0583 # NJ\n", "lon = -74.4057 # NJ\n", "\n", "# MakeModule Parameters\n", "moduletype='test-module'\n", "numpanels = 3 # AgriPV site has 3 modules along the y direction (N-S since we are facing it to the south) .\n", "x = 0.95 \n", "y = 1.95\n", "xgap = 2.0# Leaving 15 centimeters between modules on x direction\n", "ygap = 0.10 # Leaving 10 centimeters between modules on y direction\n", "zgap = 0 # no gap to torquetube.\n", "sensorsy = 6*numpanels # this will give 6 sensors per module, 1 per cell\n", "\n", "# Other default values:\n", "\n", "# TorqueTube Parameters\n", "axisofrotationTorqueTube=False # this is False by default if there is no torquetbue parameters\n", "torqueTube = False\n", "cellLevelModule = True\n", "\n", "numcellsx = 12\n", "numcellsy = 6\n", "xcell = 0.156\n", "ycell = 0.156\n", "xcellgap = 0.02\n", "ycellgap = 0.02\n", "\n", "cellLevelModuleParams = {'numcellsx': numcellsx, 'numcellsy':numcellsy, \n", " 'xcell': xcell, 'ycell': ycell, 'xcellgap': xcellgap, 'ycellgap': ycellgap}\n", "\n", "# SceneDict Parameters\n", "pitch = 15 # m\n", "albedo = 0.2 #'grass' # ground albedo\n", "hub_height = 4.3 # m \n", "nMods = 6 # six modules per row.\n", "nRows = 3 # 3 row\n", "\n", "azimuth_ang=180 # Facing south\n", "tilt =35 # tilt. \n", "\n", "# Now let's run the example\n", "\n", "demo = br.RadianceObj(simulationname,path = testfolder) \n", "demo.setGround(albedo) \n", "epwfile = demo.getEPW(lat, lon) # NJ lat/lon 40.0583° N, 74.4057\n", "metdata = demo.readWeatherFile(epwfile, coerce_year=2001) \n", "timestamp = metdata.datetime.index(pd.to_datetime('2001-06-17 13:0:0 -5')) # Make this timezone aware, use -5 for EST.\n", "demo.gendaylit(timestamp) \n", "\n", "\n", "# Making module with all the variables\n", "module=demo.makeModule(name=moduletype,x=x,y=y,numpanels=numpanels, \n", " xgap=xgap, ygap=ygap, cellModule=cellLevelModuleParams)\n", "# create a scene with all the variables\n", "sceneDict = {'tilt':tilt,'pitch': 15,'hub_height':hub_height,'azimuth':azimuth_ang, 'nMods': nMods, 'nRows': nRows} \n", "scene = demo.makeScene(module=moduletype, sceneDict=sceneDict) \n", "octfile = demo.makeOct(demo.getfilelist())\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If desired, you can view the Oct file at this point:\n", "\n", "***rvu -vf views\\front.vp -e .01 tutorial_11.oct***" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "\n", "## Comment the ! line below to run rvu from the Jupyter notebook instead of your terminal.\n", "## Simulation will stop until you close the rvu window\n", "\n", "#!rvu -vf views\\front.vp -e .01 tutorial_11.oct\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "And adjust the view parameters, you should see this image.\n", "\n", "![AgriPV modeled step 1](../images_wiki/AdvancedJournals/AgriPV_step1.PNG)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding the structure\n", "\n", "We will add on the torquetube and pillars.\n", "\n", "Positions of the piles could be done more programatically, but they are kinda estimated at the moment. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Custom Object Name objects\\Post1.rad\n", "\n", "Custom Object Name objects\\Post2.rad\n", "\n", "Custom Object Name objects\\Post3.rad\n" ] } ], "source": [ "torquetubelength = module.scenex*(nMods) \n", "\n", "name='Post1'\n", "text='! genbox Metal_Aluminum_Anodized torquetube_row1 {} 0.2 0.3 | xform -t {} -0.1 -0.3 | xform -t 0 0 4.2'.format(\n", " torquetubelength, (-torquetubelength+module.sceney)/2.0)\n", "customObject = demo.makeCustomObject(name,text)\n", "scene.appendtoScene(radfile=scene.radfiles[0],customObject=customObject)\n", "\n", "name='Post2'\n", "text='! genbox Metal_Aluminum_Anodized torquetube_row2 {} 0.2 0.3 | xform -t {} -0.1 -0.3 | xform -t 0 15 4.2'.format(\n", " torquetubelength, (-torquetubelength+module.sceney)/2.0)\n", "customObject = demo.makeCustomObject(name,text)\n", "scene.appendtoScene(customObject=customObject)\n", "\n", "name='Post3'\n", "text='! genbox Metal_Aluminum_Anodized torquetube_row2 {} 0.2 0.3 | xform -t {} -0.1 -0.3 | xform -t 0 -15 4.2'.format(\n", " torquetubelength, (-torquetubelength+module.sceney)/2.0)\n", "customObject = demo.makeCustomObject(name,text)\n", "scene.appendtoScene(customObject=customObject)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Custom Object Name objects\\Pile.rad\n", "Created tutorial_11.oct\n" ] } ], "source": [ "name='Pile'\n", "pile1x = (torquetubelength+module.sceney)/2.0\n", "pilesep = pile1x*2.0/7.0\n", "\n", "text= '! genrev Metal_Grey tube1row1 t*4.2 0.15 32 | xform -t {} 0 0'.format(pile1x)\n", "text += '\\r\\n! genrev Metal_Grey tube1row2 t*4.2 0.15 32 | xform -t {} 15 0'.format(pile1x)\n", "text += '\\r\\n! genrev Metal_Grey tube1row3 t*4.2 0.15 32 | xform -t {} -15 0'.format(pile1x)\n", "\n", "for i in range (1, 7):\n", " text += '\\r\\n! genrev Metal_Grey tube{}row1 t*4.2 0.15 32 | xform -t {} 0 0'.format(i+1, pile1x-pilesep*i)\n", " text += '\\r\\n! genrev Metal_Grey tube{}row2 t*4.2 0.15 32 | xform -t {} 15 0'.format(i+1, pile1x-pilesep*i)\n", " text += '\\r\\n! genrev Metal_Grey tube{}row3 t*4.2 0.15 32 | xform -t {} -15 0'.format(i+1, pile1x-pilesep*i)\n", "\n", "customObject = demo.makeCustomObject(name,text)\n", "scene.appendtoScene( customObject=customObject)\n", "\n", "octfile = demo.makeOct() # makeOct combines all of the ground, sky and object files we just added into a .oct file." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### View the geometry with the posts on :\n", "\n", "***rvu -vf views\\front.vp -e .01 -pe 0.4 -vp 12 -10 3.5 -vd -0.0995 0.9950 0.0 tutorial_11.oct***\n", "\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "\n", "## Comment the ! line below to run rvu from the Jupyter notebook instead of your terminal.\n", "## Simulation will stop until you close the rvu window\n", "\n", "#!rvu -vf views\\front.vp -e .01 tutorial_11.oct\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "![AgriPV modeled step 2](../images_wiki/AdvancedJournals/AgriPV_step2.PNG)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Analyse the Ground Irradiance\n", "\n", "Now let's do some analysis along the ground, starting from the edge of the modules. We wil select to start in the center of the array.\n", "\n", "We are also increasign the number of points sampled accross the collector width, with the variable **sensorsy** passed to **moduleanalysis**. We are also increasing the step between sampling points, to be able to sample in between the rows.\n", "\n", "**We'll use the new `AnalysisObj.groundAnalysis()` function starting in v0.5.0 to determine the scan points on the ground.**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'xstart': np.float16(0.0),\n", " 'ystart': np.float16(0.0),\n", " 'zstart': np.float16(0.05),\n", " 'xinc': np.float16(0.0),\n", " 'yinc': np.float16(-0.7896),\n", " 'zinc': np.float16(0.0),\n", " 'sx_xinc': 0.0,\n", " 'sx_yinc': 0.0,\n", " 'sx_zinc': 0.0,\n", " 'Nx': 1,\n", " 'Ny': 20,\n", " 'Nz': 1,\n", " 'orient': '0 0 -1'}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis = br.AnalysisObj(octfile, demo.name) \n", "sensorsy = 20\n", "frontscan, backscan = analysis.moduleAnalysis(scene, sensorsy=sensorsy)\n", "groundscan = analysis.groundAnalysis(scene, sensorsground=sensorsy)\n", "groundscan" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linescan in process: tutorial_11_scan_Row2_Module3_Front\n", "Saved: results\\irr_tutorial_11_scan_Row2_Module3.csv\n" ] }, { "data": { "text/plain": [ "{'Wm2': array([332.89396667, 691.32513333, 715.60123333, 735.5388 ,\n", " 744.5296 , 749.1159 , 750.81526667, 752.03366667,\n", " 751.96643333, 747.43736667, 743.95496667, 738.61256667,\n", " 734.60366667, 723.0667 , 708.3394 , 696.8361 ,\n", " 342.9871 , 323.97993333, 317.4839 , 337.0623 ]),\n", " 'x': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0.]),\n", " 'y': array([ 0. , -0.7896, -1.579 , -2.37 , -3.158 , -3.947 ,\n", " -4.74 , -5.527 , -6.316 , -7.105 , -7.895 , -8.69 ,\n", " -9.48 , -10.266 , -11.055 , -11.84 , -12.63 , -13.42 ,\n", " -14.21 , -15. ]),\n", " 'z': array([0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,\n", " 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05]),\n", " 'r': array([332.7998, 691.1785, 715.4303, 735.3883, 744.4058, 749.002 ,\n", " 750.7009, 751.9545, 751.8872, 747.358 , 743.8846, 738.5325,\n", " 734.5281, 722.988 , 708.2579, 696.7358, 342.8804, 323.8683,\n", " 317.3708, 336.9688]),\n", " 'g': array([332.8915, 691.3184, 715.5896, 735.5281, 744.5209, 749.1077,\n", " 750.807 , 752.0269, 751.9597, 747.4299, 743.9487, 738.6053,\n", " 734.5966, 723.0601, 708.3321, 696.8274, 342.9784, 323.9724,\n", " 317.4785, 337.0594]),\n", " 'b': array([332.9906, 691.4785, 715.7838, 735.7 , 744.6621, 749.238 ,\n", " 750.9379, 752.1196, 752.0524, 747.5242, 744.0316, 738.6999,\n", " 734.6863, 723.152 , 708.4282, 696.9451, 343.1025, 324.0991,\n", " 317.6024, 337.1587]),\n", " 'mattype': array(['groundplane', 'groundplane', 'groundplane', 'groundplane',\n", " 'groundplane', 'groundplane', 'groundplane', 'groundplane',\n", " 'groundplane', 'groundplane', 'groundplane', 'groundplane',\n", " 'groundplane', 'groundplane', 'groundplane', 'groundplane',\n", " 'groundplane', 'groundplane', 'groundplane', 'groundplane'],\n", " dtype='" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Analyse and MAP the Ground Irradiance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " We will use the same technique to find the irradiance on the ground used above, but will move it along the X-axis to map from the start of one module to the next.\n", " \n", " We will sample around the module that is placed at the center of the field." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![AgriPV modeled step 4](../images_wiki/AdvancedJournals/spacing_between_modules.PNG)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'xstart': np.float16(0.0), 'ystart': 5.0, 'zstart': np.float16(0.05), 'xinc': np.float16(0.0), 'yinc': np.float16(-0.1531), 'zinc': np.float16(0.0), 'sx_xinc': np.float64(0.08023529411764706), 'sx_yinc': np.float64(9.825989611982292e-18), 'sx_zinc': 0.0, 'Nx': 50, 'Ny': 50, 'Nz': 1, 'orient': '0 0 -1'}\n" ] } ], "source": [ "# Use the groundAnalysis function released in bifacial_radiance v0.5.0. With sensorsx=20 it will be a 2D scan.\n", "\n", "groundscan = analysis.groundAnalysis(scene, sensorsground=50, sensorsgroundx=50, modWanted=3)\n", "groundscan['ystart'] = scene.sceneDict['pitch'] / 3 # start the scan in the middle of the row for better visualization\n", "groundscan['yinc'] = groundscan['yinc']/2 # zoom in for higher resolution scan\n", "print(groundscan)\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linescan in process: tutorial_11_scan_xy_Row2_Module3_Front\n", "Saved: results\\irr_tutorial_11_scan_xy_Row2_Module3.csv\n" ] }, { "data": { "text/plain": [ "{'Wm2': array([726.9225 , 725.8793 , 724.83606667, ..., 729.0038 ,\n", " 732.92426667, 737.66856667], shape=(2500,)),\n", " 'x': array([0. , 0. , 0. , ..., 3.931529, 3.931529, 3.931529],\n", " shape=(2500,)),\n", " 'y': array([ 5. , 4.847656, 4.695312, ..., -2.195312, -2.347656,\n", " -2.5 ], shape=(2500,)),\n", " 'z': array([0.05, 0.05, 0.05, ..., 0.05, 0.05, 0.05], shape=(2500,)),\n", " 'r': array([726.8588, 725.8158, 724.7727, ..., 728.8752, 732.791 , 737.5244],\n", " shape=(2500,)),\n", " 'g': array([726.9164, 725.8732, 724.83 , ..., 728.9965, 732.9161, 737.6588],\n", " shape=(2500,)),\n", " 'b': array([726.9923, 725.9489, 724.9055, ..., 729.1397, 733.0657, 737.8225],\n", " shape=(2500,)),\n", " 'mattype': array(['groundplane', 'groundplane', 'groundplane', ..., 'groundplane',\n", " 'groundplane', 'groundplane'], shape=(2500,), dtype='" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create a pivot table to reshape data into a grid\n", "heatmap_data = resultsDF.pivot_table(index='y', columns='x', values='Wm2Front', aggfunc='mean')\n", "plt.figure(figsize=(10, 8))\n", "#plt.imshow(heatmap_data, aspect='auto', origin='lower') # imshow doesn't preserve correct x and y coordinates.\n", "#plt.colorbar(label='Wm-2')\n", "ax = sns.heatmap(heatmap_data, cbar_kws={'label': 'Wm-2'})\n", "ax.invert_yaxis()\n", "plt.xlabel('X')\n", "plt.ylabel('Y')\n", "plt.title('Heatmap: ground irradiance')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "## Deprecated method, but still works.\n", "sensorsx = 20\n", "startgroundsample=-module.scenex\n", "spacingbetweensamples = module.scenex/(sensorsx-1)\n", "\n", "for i in range (0, sensorsx): # Will map 20 points \n", " frontscan, backscan = analysis.moduleAnalysis(scene, sensorsy=sensorsy)\n", " groundscan = frontscan\n", " groundscan['zstart'] = 0.05 # setting it 5 cm from the ground.\n", " groundscan['zinc'] = 0 # no tilt necessary. \n", " groundscan['yinc'] = pitch/(sensorsy-1) # increasing spacing so it covers all distance between rows\n", " groundscan['xstart'] = startgroundsample + i*spacingbetweensamples # increasing spacing so it covers all distance between rows\n", " analysis.analysis(octfile, simulationname+\"_groundscan_\"+str(i), groundscan, backscan) # compare the back vs front irradiance " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filestarter = \"irr_tutorial_11_groundscan_\"\n", "\n", "filelist = sorted(os.listdir(os.path.join(testfolder, 'results')))\n", "prefixed = [filename for filename in filelist if filename.startswith(filestarter)]\n", "arrayWm2Front = []\n", "arrayMatFront = []\n", "filenamed = []\n", "faillist = []\n", "\n", "print('{} files in the directory'.format(filelist.__len__()))\n", "print('{} groundscan files in the directory'.format(prefixed.__len__()))\n", "i = 0 # counter to track # files loaded.\n", "\n", "for i in range (0, len(prefixed)):\n", " ind = prefixed[i].split('_')\n", "\n", " try:\n", " resultsDF = br.load.read1Result(os.path.join(testfolder, 'results', prefixed[i]))\n", " arrayWm2Front.append(list(resultsDF['Wm2Front']))\n", " arrayMatFront.append(list(resultsDF['mattype']))\n", " filenamed.append(prefixed[i])\n", " except:\n", " print(\" FAILED \", i, prefixed[i])\n", " faillist.append(prefixed[i])\n", "\n", "resultsdf = pd.DataFrame(list(zip(arrayWm2Front, \n", " arrayMatFront)),\n", " columns = ['br_Wm2Front', \n", " 'br_MatFront'])\n", "resultsdf['filename'] = filenamed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Creating a new dataframe where each element in the front irradiance list is a column. Also transpose and reverse so it looks like a top-down view of the ground." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df3 = pd.DataFrame(resultsdf['br_Wm2Front'].to_list())\n", "reversed_df = df3.T.iloc[::-1]\n", "sns.set(rc={'figure.figsize':(11.7,8.27)})" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3 4 5 6 7 \\\n", "19 707.406 717.969 716.894 714.724 714.243 716.414 712.684 712.545 \n", "18 729.280 732.414 729.824 730.705 729.512 728.390 732.200 729.413 \n", "17 742.290 741.332 741.132 742.073 740.483 742.423 740.617 742.121 \n", "16 748.540 749.139 750.334 747.030 746.692 748.511 748.210 747.987 \n", "15 751.114 750.602 750.646 748.215 751.154 750.184 750.756 748.963 \n", "14 750.900 751.425 750.603 751.448 750.752 749.719 750.619 749.944 \n", "13 749.895 750.598 750.358 750.608 749.556 748.857 749.798 748.299 \n", "12 749.067 747.934 746.706 748.213 748.873 747.933 745.351 747.451 \n", "11 747.113 743.653 745.578 743.618 744.040 745.298 742.976 745.138 \n", "10 740.553 740.609 740.436 740.262 741.033 741.978 740.426 741.833 \n", "9 737.209 736.845 736.907 736.815 737.291 736.247 734.540 736.351 \n", "8 729.293 729.673 727.995 728.887 726.439 725.763 728.758 727.641 \n", "7 719.901 718.717 720.173 718.191 716.884 718.772 719.067 718.369 \n", "6 700.821 702.329 705.662 701.864 707.937 704.963 700.293 704.312 \n", "5 354.341 683.318 687.082 686.330 686.340 684.015 687.402 684.329 \n", "4 334.167 662.397 664.277 668.186 670.255 664.270 664.053 663.075 \n", "3 320.988 314.571 319.350 321.853 321.258 321.913 320.597 319.688 \n", "2 320.926 273.219 294.420 647.285 657.277 664.323 668.472 664.876 \n", "1 673.899 704.114 693.208 692.315 687.508 688.551 685.345 681.715 \n", "0 707.498 716.469 715.741 713.949 716.359 714.613 711.151 711.483 \n", "\n", " 8 9 10 11 12 13 14 15 \\\n", "19 705.832 708.720 703.669 704.252 702.321 708.024 718.406 706.891 \n", "18 728.908 729.055 725.850 730.129 726.288 727.500 728.547 727.856 \n", "17 741.224 739.863 738.964 740.845 741.500 740.430 742.609 745.785 \n", "16 745.745 749.318 745.715 748.944 750.367 749.119 747.044 747.491 \n", "15 751.969 750.249 750.950 751.556 751.332 749.325 750.176 751.702 \n", "14 751.767 751.910 751.030 751.151 750.852 751.570 751.093 751.438 \n", "13 751.435 751.356 749.836 749.849 749.996 750.831 750.609 749.603 \n", "12 748.000 748.337 748.766 749.181 748.254 747.095 749.462 748.451 \n", "11 746.259 744.259 743.422 744.654 746.670 745.473 746.861 745.804 \n", "10 738.829 742.371 740.733 741.055 742.475 742.264 742.060 740.075 \n", "9 736.462 736.461 735.780 736.916 736.081 738.540 737.089 737.146 \n", "8 729.293 728.309 727.202 729.124 728.198 727.733 730.143 729.315 \n", "7 716.004 717.708 716.707 719.645 717.529 718.759 718.789 716.356 \n", "6 700.026 698.568 701.876 701.915 703.323 697.521 703.071 702.413 \n", "5 675.622 352.690 353.954 680.402 350.238 352.881 350.218 352.422 \n", "4 659.245 329.629 330.931 328.748 328.929 327.717 656.867 326.471 \n", "3 319.938 319.540 320.286 316.757 318.837 315.101 319.000 312.704 \n", "2 329.639 324.359 326.718 646.582 322.878 321.502 322.878 320.654 \n", "1 676.957 676.866 674.528 670.076 685.064 677.959 674.577 678.735 \n", "0 705.578 705.871 701.008 706.876 706.066 704.624 707.191 707.824 \n", "\n", " 16 17 18 19 \n", "19 708.602 709.554 715.373 721.070 \n", "18 729.540 730.513 730.164 729.620 \n", "17 742.639 742.209 742.780 741.877 \n", "16 749.018 746.404 747.755 746.784 \n", "15 749.695 751.076 750.510 751.580 \n", "14 752.223 750.664 750.881 751.237 \n", "13 751.574 749.701 750.096 750.593 \n", "12 746.353 750.063 749.250 748.708 \n", "11 745.252 744.550 745.143 746.247 \n", "10 740.399 740.694 742.419 740.563 \n", "9 736.811 735.837 735.107 737.445 \n", "8 727.679 725.720 726.642 728.830 \n", "7 718.192 717.113 720.348 718.582 \n", "6 701.093 699.885 701.115 703.428 \n", "5 354.495 352.973 358.208 686.067 \n", "4 330.890 334.090 328.851 664.724 \n", "3 317.191 319.022 320.305 314.738 \n", "2 327.450 328.641 648.727 629.784 \n", "1 680.499 686.356 691.963 699.706 \n", "0 710.695 708.237 712.785 715.473 \n", "\n" ] }, { "data": { "image/png": "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II1WJF0AAAAZSboAAIC0yiCNNiRdAAAAGSm6AAAAMtJeCAAApBmk0YqkCwAAICNJFwAAkFR1DdJoQ9IFAACQkaILAAAgI+2FAABAmkEarUi6AAAAMpJ0AQAAaZKuViRdAAAAGSm6AAAAMtJeCAAApFXO09WGpAsAACAjSRcAAJBmkEYrki4AAICMFF0AAAAZaS8EAACSKu2FrUi6AAAAMpJ0AQAAaZKuViRdAAAAGSm6AAAAMtJeCAAApHW7vV5BX5N0AQAAE9add94Zf/EXfxGvf/3r4y1veUt861vfGt32yCOPxHnnnRfHHnts/Omf/ml84QtfiOHh4d2uf/PNN8fSpUvjDW94Q5x55pmxYcOGca9B0QUAALz0II1efuylr3/967F8+fJ497vfHXfddVeceuqp8ZGPfCS+//3vx65du+K9731vs9+tt94an/rUp+Lf//3f41/+5V9Gr/+1r30tPvvZz8bf/u3fxh133BGHHHJILFu2LJ588slxraNTVdWY/i92Pf7T8f4/Qtm6u7+LUYRJA1GU0m6j0m4fABinwT98bfSjZ8//857+/P2u/U06NVZ1mVMnVG9+85vj4x//+OjldaF1/PHHx8EHHxx/93d/F9/5znfigAMOaLZ9+ctfboqs7373uzFlypTmum9605vioosuarYPDQ0137/rXe9qErLf/zFd/viirdIeQyUq7TaqSuvf9rzvu8cQL83vs/56TJd4f5V2G5WmxPuMl8WDDz4Yv/jFL+K0007b7fIbbrih+VwnW0ceeeRowVVbvHhxbN26NTZu3NikWg899FAsWbJkdPvkyZPjuOOOi3Xr1mUqugAAgFemHp+na+nSpcntq1ev3mPRVXv++eebdKs+FqsupN7//vfHySefHJs3b445c+bsdp1Zs2Y1nzdt2tQUWLW5c+e+aJ977713XOt3TBcAADDhbN26tflctxbWx3KtXLky/uRP/iTOP//8pn1w+/btTQvhC02dOrX5vGPHjti2bVvz9Z72qbePh6QLAABIGuMYiGxW7yHJeimDg4PN5zrlOv3005uv//iP/7hJvG688caYNm1a7Ny5c7frjBRTM2bMaLbX9rTP9OnTx7UWSRcAADDhzJ49u/m8YMGC3S4/7LDDmlHxdWvhli1bdts28n193ZG2wj3tM/Jvj5WiCwAAmHCOPPLI2GeffeKH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0gUAAJCRogsAACAj7YUAAEBS1yCNViRdAAAAGUm6AACApKqSdLUh6QIAAMhI0QUAAJCR9kIAACDJII12JF0AAAAZSboAAIAkgzTakXQBAABkpOgCAADISHshAACQ1NVe2IqkCwAAICNFFwAAkFT1+L+99cQTT8RFF10UixcvjmOOOSbe9773xU9+8pPR7Rs3boyzzjorjj766Dj55JPjpptu2u363W43rr766jjhhBOafc4999x4+OGHx70ORRcAADAhfeADH4if/exnsWLFivjqV78a06ZNi/e85z2xbdu2eOqpp2LZsmVx6KGHxu23397se8UVVzRfj7j22mvjlltuicsuuyxuvfXWpgg755xzYufOneNah2O6AACACefpp5+Ogw8+OM4777xYsGBBc9n5558fb3vb2+L++++P7373uzE4OBiXXnppTJ48OebPnz9aoJ1xxhlNYbVy5cq48MIL46STTmquf9VVVzWp19133x2nnnrqmNei6AIAAIo+T9fSpUuT21evXv2iyw444ID4/Oc/P/r9k08+GatWrYo5c+bEYYcdFtdcc00cf/zxTcE1om5DvO666+Lxxx+PRx99NJ577rlYsmTJ6Pb9998/jjjiiFi3bp2iCwAAYMQ//MM/xG233RZTpkyJL37xizFjxozYvHnzaAI2YtasWc3nTZs2Ndtrc+fOfdE+I9vGStEFAAAkdVsMs/h92FOSNR5//dd/He985zvj5ptvbo7dqo/T2r59e1OEvdDUqVObzzt27GiO+6rtaZ+6dTFL0fXD6/57lKQzd16Upnr+2ShK1Y2iDA/1egXl67rPUtZ+8W29XkL5SnveD5X1GPr+l/5HFGfn9ihKYc/7GCjs/eFOgTPIBnf/g7DnCltPZ8q0Xi+BAtTthLXLL788fvjDH8a//du/NUM1fnsgRl1s1eokrN5eq/cZ+Xpkn+nTp4/r5xf4ygEAANBOfQzXXXfdFUMveANw0qRJTQG2ZcuW5tiu+vMLjXw/e/bs0bbCPe1Tbx8PRRcAAPCSgzR6+bE36mEYH/nIR5ophSN27doVGzZsaCYVLlq0KL73ve/F8PDw6PY1a9bEvHnzYubMmbFw4cLYd999Y+3ataPbn3nmmeb69XXHQ9EFAABMOAsWLIgTTzwx/umf/qmZNnjffffFJz7xiaZwqs/VVY+F37p1ayxfvjweeOCBuOOOO5rphvWI+ZFjueoTJ9fn7qqPKbv33nvjwx/+cJOQnXLKKeNaS2GN0gAAQGm6PR4Zv7euvPLKZmx8XSw9++yzcdxxxzXDNP7oj/6o2X799dc3x3mdfvrpcdBBB8XHPvax5usRF1xwQdOeePHFFzeDN+qE64YbbmjO7zUenWqMed22O/45SmKQRh8eUF/awdklMkgjbdf4zv7+ilTa876wQRqx36uiOAZppBmk0XeDK4pbT2GDNKaf+J7oRwfu97qe/vwnn70/+lmBrxwAAAATR2FvHwEAAKXZ22EW/JqkCwAAICNJFwAAkNQNSVcbki4AAICMFF0AAAAZaS8EAACSDNJoR9IFAACQkaQLAABI6kq6WpF0AQAAZKToAgAAyEh7IQAAkFQ5T1crki4AAICMJF0AAECSQRrtSLoAAAAyUnQBAABkpL0QAABIqrQXtiLpAgAAyEjSBQAAJBkZ346kCwAAICNFFwAAQEbaCwEAgCSDNNqRdAEAAGQk6QIAAJIkXe1IugAAADJSdAEAAGSkvRAAAEjSXNiOpAsAACCjTuWoOAAAgGwkXQAAABkpugAAADJSdAEAAGSk6AIAAMhI0QUAAJCRogsAACAjRRcAAEBGii4AAICMFF0AAACRz/8DtEaIou+8fn0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot\n", "print(reversed_df)\n", "ax = sns.heatmap(reversed_df[-20:-1])\n", "ax.set_yticks([])\n", "ax.set_xticks([])\n", "ax.set_ylabel('') \n", "ax.set_xlabel('') \n", "print('')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Adding different Albedo Sections\n", "Add a surface (just like we added the pillars) with a specific reflectivity to represent different albedo sections. In the image, we can see that the albedo between the crops is different than the crop albedo. Let's assume that the abledo between the crops is higher than the crop's albedo which wa previuosly set a 0.2.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "name='Center_Grass'\n", "carpositionx=-2\n", "carpositiony=-1\n", "text='! genbox white_EPDM CenterPatch 28 12 0.1 | xform -t -14 2 0'.format(carpositionx, carpositiony)\n", "customObject = demo.makeCustomObject(name,text)\n", "scene.appendtoScene(customObject)\n", "\n", "octfile = demo.makeOct(demo.getfilelist()) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Viewing with rvu:\n", "\n", "![AgriPV modeled step 4](../images_wiki/AdvancedJournals/AgriPV_step4.PNG)\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "bifirad_eager", "language": "python", "name": "bifiradiance_eager" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.8" } }, "nbformat": 4, "nbformat_minor": 4 }